查看原文
其他

Nginx通过split_client实现客户端分流

运维研习社 运维研习社 2022-11-05


之前介绍过Nginx通过cookie做灰度发布,通过判断cookie,将不同的请求根据需求分流到不同的后端,如图

上面的方法是通过判断cookie来进行分流的,其实在Nginx中专门有个模块是做客户端分流的——split_clients


在nginx官网文档中,定义split_clients是可以用来构建适用于A/B测试的变量



它这句话,如果你没使用split_clients的话,比较难理解,其实它就是定义了一组变量,通过使用变量来进行分流


如果你读了上面通过cookie做灰度发布的话,里面有关于nginx中map的介绍,你会发现split_clients和map定义变量是一样的,只不过,它这里还有一个hash算法的配置比例


split_clients是通过MurmurHash2算法对原始字符串进行哈希处理,源码在http/modules/ngx_http_split_clients_module.c


MurmurHash算法在core/ngx_murmurhash.c


就这么一段,murmurhash是一种非加密型哈希函数,由Austin Appleby于08年发明,现在最新版本为murmurhash3,性能是md5的4倍左右,在redis中应用广泛,包括数据库、集群、哈希键、阻塞操作 等功能都有用到这个算法


在nginx中, split_clients执行过程如下:

  • 对设定的变量获取到的值执行Murmurhash2算法得到32位整型哈希值,记为hash

  • 32位无符号整型的最大数字2^32-1,记为max,也就是最大值

  • 哈希数字与最大数字相除hash/max,可以得到百分比percent

  • 配置指令中配置各个百分比范围对应的新变量值

  • 当percent落在配置的范围里时,新变量值就对应赋值给$variant


各个百分比相加不能超过100%,* 表示匹配剩余的百分比,百分比可以为小数点后两位的小数


以上就是split_clients的执行过程,因为split_clients可以构造新的变量,通过这个特性,我们可以把该变量作为内部自定义变量用在很多地方,比如上图中,将该变量用在upstream的命名中,这个时候,我们就可以通过remote_ip、cookie_hash、url_hash等你需要的变量来进行分流,让不同的客户端,访问到对应的upstream上游服务器,配置示例如下:


类似的,还可以在fastcgi代理的时候,设置不同的fpm后端,另外可以在配置代理缓存、临时文件缓存时将不同的缓存分别存储到不同的位置等


split_client使用比较灵活,例如可以在并发活动中,通过以上方式限流、分流等


更多使用方式欢迎评论留言!


利用Nginx流量镜像,优雅的接入waf Nginx/OpenResty内存泄露及目录穿越漏洞复现 Nginx调试必备 



更多精彩内容请扫描下方二维码关注公众号


扫描二维码关注我们吧



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存